const { Ollama } = require('ollama')

// 创建Ollama客户端
const ollama = new Ollama({
  host: 'http://localhost:11434'
})

/**
 * 调用本地Ollama AI模型分析面部数据
 * @param {Object} faceAnalysisData - 面部分析数据
 * @returns {Promise<string>} AI分析结果
 */
async function analyzeWithOllama(faceAnalysisData) {
  try {
    // 关键节点：开始调用
    console.log('🤖 调用本地Ollama AI模型')
    
    // 构建提示词
    const prompt = buildPrompt(faceAnalysisData)
    
    // 精简：只输出人脸数
    console.log(`📝 AI输入概览: faces=${faceAnalysisData.faceCount}`)
    
    // 调用AI模型
    const response = await ollama.chat({
      model: 'llama3:latest', // 使用可用的模型
      messages: [
        {
          role: 'user',
          content: prompt
        }
      ],
      stream: false
    })
    
    const aiResult = response.message.content
    
    // 关键节点：AI返回
    console.log('🎯 AI分析完成，返回文本长度:', aiResult?.length || 0)
    
    return aiResult
    
  } catch (error) {
    console.error('❌ Ollama AI调用失败:', error.message)
    
    // 检查常见错误原因
    if (error.message.includes('ECONNREFUSED')) {
      console.log('💡 请确保Ollama服务正在运行: ollama serve')
    } else if (error.message.includes('model')) {
      console.log('💡 请确保已下载模型: ollama pull llama3')
    }
    
    return null
  }
}

/**
 * 构建AI分析的提示词
 * @param {Object} data - 面部分析数据
 * @returns {string} 构建好的提示词
 */
function buildPrompt(data) {
  if (data.faceCount === 0) {
    return `
你是一位专业的中文医美顾问。请用中文分析以下情况：

图片信息：
- 图片质量：${(data.imageInfo?.width > 800 && data.imageInfo?.height > 600) ? '高清' : '标清'}
- 检测结果：未检测到人脸

请详细分析可能的原因并给出改进建议。要求：
1. 必须用中文回复，不要使用英文
2. 语言要专业友好
3. 提供详细的分析和建议
`
  }
  
  // 构建详细的面部分析数据
  let detailedAnalysis = `
图片基本信息：
- 图片质量：${(data.imageInfo?.width > 800 && data.imageInfo?.height > 600) ? '高清' : '标清'}
- 检测到人脸数量：${data.faceCount} 张

`

  // 为每张检测到的人脸生成详细数据
  data.faces.forEach((face, index) => {
    detailedAnalysis += `人脸 ${index + 1} 详细分析数据：

基本检测信息：
- 人脸清晰度：${face.confidence > 0.9 ? '非常清晰' : face.confidence > 0.7 ? '清晰' : '一般'}
- 检测置信度：${(face.confidence * 100).toFixed(1)}%

年龄性别分析：`
    
    if (face.gender) {
      const genderText = face.gender.genderZh || (face.gender.gender === 'male' ? '男性' : '女性')
      detailedAnalysis += `
- 性别：${genderText}
- 性别识别置信度：${face.gender.probability}%`
    }
    
    if (face.age) {
      detailedAnalysis += `
- 估计年龄：${face.age.age}岁
- 年龄段：${face.age.ageRange}`
    }
    
    detailedAnalysis += `

表情分析：`
    if (face.expressions) {
      detailedAnalysis += `
- 主要表情：${face.expressions.dominant} (原始: ${face.expressions.dominantOriginal || face.expressions.dominant})
- 表情置信度：${face.expressions.confidence}%
- 各表情分数：`
      // 优先使用翻译后的中文表情分数
      const scoresData = face.expressions.scores || face.expressions.scoresOriginal || {}
      Object.entries(scoresData).forEach(([emotion, score]) => {
        detailedAnalysis += `
  * ${emotion}: ${score}%`
      })
    }
    
    detailedAnalysis += `

面部特征分析：`
    if (face.features) {
      // 将像素值转换为相对描述
      const getRelativeSize = (value, baseValue = 300) => {
        if (!value || value === 0) return '适中'
        const ratio = value / baseValue
        if (ratio < 0.8) return '较小'
        if (ratio > 1.2) return '较大' 
        return '适中'
      }
      
      detailedAnalysis += `
- 脸型：${face.features.faceShape}
- 面部比例：${face.features.faceDimensions?.ratio ? '长宽比' + face.features.faceDimensions.ratio.toFixed(2) : '未知'}
- 眼距：${getRelativeSize(face.features.eyeDistance)}
- 鼻长：${getRelativeSize(face.features.noseLength)}
- 嘴宽：${getRelativeSize(face.features.mouthWidth)}`
      
      if (face.features.measurements) {
        detailedAnalysis += `
- 下颌宽度：${getRelativeSize(face.features.measurements.jawWidth)}
- 颧骨宽度：${getRelativeSize(face.features.measurements.cheekboneWidth)}
- 额头宽度：${getRelativeSize(face.features.measurements.foreheadWidth)}
- 眼距比例：${face.features.measurements.eyeDistanceRatio ? face.features.measurements.eyeDistanceRatio.toFixed(2) : '未知'}
- 鼻宽比例：${face.features.measurements.noseWidthRatio ? face.features.measurements.noseWidthRatio.toFixed(2) : '未知'}
- 嘴宽比例：${face.features.measurements.mouthWidthRatio ? face.features.measurements.mouthWidthRatio.toFixed(2) : '未知'}
- 下颌脸部比例：${face.features.measurements.jawToFaceRatio ? face.features.measurements.jawToFaceRatio.toFixed(2) : '未知'}
- 颧骨脸部比例：${face.features.measurements.cheekToFaceRatio ? face.features.measurements.cheekToFaceRatio.toFixed(2) : '未知'}
- 额头脸部比例：${face.features.measurements.foreheadToFaceRatio ? face.features.measurements.foreheadToFaceRatio.toFixed(2) : '未知'}`
      }
      
      if (face.features.analysis) {
        detailedAnalysis += `
- 分析置信度：${face.features.analysis.confidence}%
- 分析理由：${face.features.analysis.reason}
- 分析算法：${face.features.analysis.algorithm}`
      }
    }
    
    detailedAnalysis += `

面部比例分析：`
    if (face.proportions) {
      detailedAnalysis += `
- 面部比例：${face.proportions.faceRatio}（${face.proportions.faceRatioGrade || '未评级'}）
- 三庭分析：${face.proportions.threeCourtAnalysis?.isBalanced ? '协调' : '不协调'}`
      
      if (face.proportions.threeCourtAnalysis && face.proportions.threeCourtAnalysis.upper !== undefined) {
        detailedAnalysis += `
  * 上庭比例：${face.proportions.threeCourtAnalysis.upper}%
  * 中庭比例：${face.proportions.threeCourtAnalysis.middle}%
  * 下庭比例：${face.proportions.threeCourtAnalysis.lower}%`
      }
      
      detailedAnalysis += `
- 三眼分析：${face.proportions.threeEyeAnalysis?.isBalanced ? '协调' : '不协调'}`
      
      if (face.proportions.threeEyeAnalysis) {
        detailedAnalysis += `
  * 左眼比例：${face.proportions.threeEyeAnalysis.leftEye}
  * 眼间距比例：${face.proportions.threeEyeAnalysis.eyeGap}
  * 右眼比例：${face.proportions.threeEyeAnalysis.rightEye}`
      }
      
      if (face.proportions.symmetry) {
        detailedAnalysis += `
- 面部对称性：${face.proportions.symmetry.isSymmetric ? '对称' : '不对称'}
- 左右平衡度：${face.proportions.symmetry.leftRightBalance}`
      }
    }
    

    

    
    if (index < data.faces.length - 1) {
      detailedAnalysis += `\n${'='.repeat(50)}\n`
    }
  })
  
  return `
你是一位专业的中文医美顾问和面部分析专家。请基于以下完整的科学面部分析数据，提供全面深入的专业分析报告：

${detailedAnalysis}

请提供详细的专业分析，包括：

1. **面部特征综合评估**
   - 对检测到的脸型、五官比例、面部对称性进行专业评价
   - 分析优势特征和可改善的地方
   - 基于数据的客观分析

2. **医美项目建议**
   - 基于具体的测量数据和比例分析，提供针对性的医美项目建议
   - 包括面部轮廓、五官精细调整、比例优化等
   - 每个建议要说明数据依据和预期效果

3. **非侵入性改善建议**
   - 化妆技巧建议
   - 发型设计建议
   - 护肤保养建议

4. **个性化分析**
   - 基于年龄、性别、脸型给出针对性建议
   - 考虑面部表情特点的建议

5. **数据解读和专业建议**
   - 解释关键数据的含义
   - 提供专业的美学观点

【绝对强制要求】：
1. 【CRITICAL】必须100%使用中文回复，严禁出现任何英文字母、英文单词、英文缩写或英文术语
2. 【CRITICAL】特别禁止以下英文词汇，必须使用对应中文：
   - "gentlemen/gentleman" → "先生"
   - "lady/ladies" → "女士"
   - "male/man" → "男性" 
   - "female/woman" → "女性"
   - "slimmer" → "更纤细"
   - "enhance" → "增强" 
   - "improve" → "改善"
   - "adjust" → "调整"
   - "optimization/optimize" → "优化"
   - "recommendation/recommend" → "建议"
   - "analysis/analyze" → "分析"
3. 【CRITICAL】所有专业术语必须完全中文化：
   - "golden ratio" → "黄金比例"
   - "nose width" → "鼻宽" 
   - "mouth width" → "嘴宽"
   - "eye distance" → "眼距"
   - "face shape" → "脸型"
   - "symmetry" → "对称性"
   - "proportion" → "比例"
   - "oval" → "椭圆形"
   - "round" → "圆形"
   - "square" → "方形"
   - "heart" → "心形"
   - "perfect" → "完美"
   - "excellent" → "优秀"
   - "good" → "良好"
   - "handsome" → "英俊"
   - "beautiful" → "美丽"
4. 【CRITICAL】绝对禁止使用英文数据字段名，如threeCourts要说"三庭"，noseMouthWidth要说"鼻嘴宽度比例"
5. 【CRITICAL】优缺点分析必须用"优势"、"不足"、"建议改善"等中文词汇，禁用advantages、disadvantages
6. 【CRITICAL】称呼用语必须使用中文：用"先生"而不是"gentleman"，用"女士"而不是"lady"
7. 回复语言要求：
   - 专业但通俗易懂
   - 避免生硬的医学术语
   - 语言亲切友好，具有咨询师风格
   - 绝对不能出现任何英文单词
8. 分析标准：
   - 基于科学数据客观分析
   - 建议实用可操作
   - 充分利用所有提供的测量数据
9. 回复要求：
   - 详细全面，体现专业水平
   - 不包含后台技术信息（算法、数据字段等）
   - 重点突出美容建议和改善方案
   - 确保每一个词汇都是中文
10. 【终极检查】回复完成后必须逐字检查，发现任何英文字母立即替换为对应中文
11. 【质量保证】如果无法确定某个英文词汇的中文翻译，使用通俗的中文描述替代
12. 【最终验证】在输出前再次确认：回复中绝对不能包含gentleman、gentlemen、slimmer、enhance、improve、adjust等任何英文词汇
13. 【语言纯洁性】医美建议必须使用："更纤细"、"增强"、"改善"、"调整"、"优化"等纯中文表达
14. 【零容忍政策】如果回复中包含任何英文单词，该回复将被完全拒绝，必须重新生成

重要提醒：您正在为中国用户提供医美咨询服务，必须使用标准中文表达，任何英文词汇的出现都是严重错误！

请确保您的回复是100%纯中文内容，这是绝对的硬性要求！
`
}

/**
 * 检查Ollama服务是否可用
 * @returns {Promise<boolean>} 服务是否可用
 */
async function checkOllamaStatus() {
  try {
    const models = await ollama.list()
    console.log('✅ Ollama服务连接正常')
    console.log('📋 可用模型:', models.models.map(m => m.name).join(', '))
    return true
  } catch (error) {
    console.log('❌ Ollama服务不可用:', error.message)
    return false
  }
}

module.exports = {
  analyzeWithOllama,
  checkOllamaStatus
}
